﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using FrbaBus.Properties;

namespace FrbaBus.AbmRecorrido
{
    public partial class FormAbmRecorrido : Form
    {
        private Constantes.ModoAbm modoABM = Constantes.ModoAbm.Ninguno;
        String codigoRecorrido;    //Almacena la ciudad que se esta modificando si corresponde

        //Main
        public FormAbmRecorrido()
        {
            InitializeComponent();

            //Cargar datos en la tabla
            CrearColumnasTabla();
            CargarTabla();
            buLimpiarFiltro_Click(null, null);

            BotonesEdicion(false);
        }

        private void buBuscar_Click(object sender, EventArgs e)
        {
            //Vuelve a cargar los datos en la tabla considerando los filtros
            CargarTabla();
        }

        private void buLimpiarFiltro_Click(object sender, EventArgs e)
        {
            //Actualizar los combos
            cargarCiudadesCombo(cbFiltroOrigen);
            cargarCiudadesCombo(cbFiltroDestino);
            cargarCiudadesCombo();

            cbFiltroOrigen.SelectedItem = null;
            cbFiltroDestino.SelectedItem = null;
            cbFiltroServicio.SelectedItem = null;

            rbActivo.Checked = true;
        }

        //Crea o modifica el registro que se esta editando
        private void buGuardar_Click(object sender, EventArgs e)
        {
            String msjErrores = "";

            //Validar info
            if (cbOrigen.SelectedIndex == -1){
                msjErrores += "\nDebe seleccionar la ciudad de origen." ;
            }
            if (cbDestino.SelectedIndex == -1){
                msjErrores += "\nDebe seleccionar la ciudad de destino.";
            }
            //Precio por Kg
            if (txBaseKg.Text.Length > 0)
            {
                if (!Regex.IsMatch(txBaseKg.Text, Constantes.PatronDecimal))
                {
                    msjErrores += "\nEl precio por Kg no es un número válido.";
                }
            }
            else
            {
                msjErrores += "\nEl precio por Kg no puede estar en blanco.";
            }
            //Precio por pasaje
            if (txBasePasaje.Text.Length > 0)
            {
                if (!Regex.IsMatch(txBasePasaje.Text, Constantes.PatronDecimal))
                {
                    msjErrores += "\nEl precio del pasaje no es un número válido.";
                }
            }
            else
            {
                msjErrores += "\nEl precio del pasaje no puede estar en blanco.";
            }
            if (!(modoABM == Constantes.ModoAbm.Modificacion)) //si es alta
            {
                if (lsServicios.CheckedItems.Count == 0)
                {
                    msjErrores += "\nDebe elegir al menos un servicio.";
                }
            }
            if (msjErrores.Length > 0)
            {
                MessageBox.Show("No se pudo guardar los datos, se encontraron los siguientes errores:" + msjErrores);
            }
            else
            {
                //Guardar

                    if (modoABM == Constantes.ModoAbm.Modificacion)
                    {
                        //Actualiza los cambios
                        string sConnectionString = Settings.Default.GD1C2013ConnectionString;
                        SqlConnection connection = new SqlConnection(sConnectionString);
                        SqlCommand cmd = new SqlCommand("THE_BEST_IAS.pr_modif_recorrido", connection);
            
                        cmd.CommandType = CommandType.StoredProcedure;

                        cmd.Parameters.Add(new SqlParameter("@p_rec_codigo", SqlDbType.Int)).Value = codigoRecorrido;
                        cmd.Parameters.Add(new SqlParameter("@p_ciu_nombre_origen", SqlDbType.NVarChar)).Value = cbOrigen.SelectedItem.ToString();
                        cmd.Parameters.Add(new SqlParameter("@p_ciu_nombre_destino", SqlDbType.NVarChar)).Value = cbDestino.SelectedItem.ToString();
                        cmd.Parameters.Add(new SqlParameter("@p_serv_nombre", SqlDbType.NVarChar)).Value = cbServicio.SelectedItem.ToString();
                        cmd.Parameters.Add(new SqlParameter("@p_rec_precio_base_pasaje", SqlDbType.Decimal)).Value = Convert.ToDecimal(txBasePasaje.Text);
                        cmd.Parameters.Add(new SqlParameter("@p_rec_precio_base_encomienda", SqlDbType.Decimal)).Value = Convert.ToDecimal(txBaseKg.Text);
                        
                        ////Una vez dado de baja no se puede volver a habilitar
                        /*if (chHabilitado.Checked)
                            cmd.Parameters.Add(new SqlParameter("@rec_eliminado", SqlDbType.Int)).Value = 0;
                        else
                            cmd.Parameters.Add(new SqlParameter("@rec_eliminado", SqlDbType.Int)).Value = 1;
                        */
                        
                        connection.Open();
                        cmd.ExecuteNonQuery(); 
                        connection.Close();

                        MessageBox.Show("El recorrido fue modificado de manera satisfactoria", "INFORMACION");

                        BotonesEdicion(false);

                        //Actualizar tabla
                        CargarTabla();
                    }
                    else
                    {
                        //Crear registros
                        string sConnectionString = Settings.Default.GD1C2013ConnectionString;
                        
                        SqlConnection connection = new SqlConnection(sConnectionString);
                        SqlCommand cmd;

                        //Almacena un registro por cada servicio
                        for (int x = 0; x < lsServicios.CheckedItems.Count; x++)
                        {
                            ////Test
                            //MessageBox.Show(lsServicios.CheckedItems[x].ToString());
                            ////

                            cmd = new SqlCommand("THE_BEST_IAS.pr_alta_recorrido", connection);

                            cmd.CommandType = CommandType.StoredProcedure;

                            cmd.Parameters.Add(new SqlParameter("@p_ciu_nombre_origen", SqlDbType.NVarChar)).Value = cbOrigen.SelectedItem.ToString();
                            cmd.Parameters.Add(new SqlParameter("@p_ciu_nombre_destino", SqlDbType.NVarChar)).Value = cbDestino.SelectedItem.ToString();
                            cmd.Parameters.Add(new SqlParameter("@p_serv_nombre", SqlDbType.NVarChar)).Value = lsServicios.CheckedItems[x].ToString();
                            cmd.Parameters.Add(new SqlParameter("@p_rec_precio_base_pasaje", SqlDbType.Decimal)).Value = Convert.ToDecimal(txBasePasaje.Text);
                            cmd.Parameters.Add(new SqlParameter("@p_rec_precio_base_encomienda", SqlDbType.Decimal)).Value = Convert.ToDecimal(txBaseKg.Text);
                            ////Una vez dado de baja no se puede volver a habilitar
                            /*if (chHabilitado.Checked)
                                cmd.Parameters.Add(new SqlParameter("@rec_eliminado", SqlDbType.Int)).Value = 0;
                            else
                                cmd.Parameters.Add(new SqlParameter("@rec_eliminado", SqlDbType.Int)).Value = 1;*/

                            connection.Open();
                            cmd.ExecuteNonQuery();
                            connection.Close();

                            MessageBox.Show("El recorrido se dió de alta de manera satisfactoria", "INFORMACION");
                        }

                        BotonesEdicion(false);

                        //Actualizar tabla
                        CargarTabla();
                    }
            }
        }

        private void buCancelar_Click(object sender, EventArgs e)
        {
            //Cancela el alta o modificación de un registro
            BotonesEdicion(false);
        }

        //Muestra todos los datos de las ciudades en la tabla
        private void CargarTabla()
        {
            bool primerFiltro = true;
            char valorEliminado;

            tabla.Rows.Clear();

            string query;

            query = "SELECT R.rec_codigo, CO.ciu_nombre as origen, CD.ciu_nombre as destino, S.serv_nombre, R.rec_precio_base_pasaje, R.rec_precio_base_encomienda, R.rec_eliminado FROM THE_BEST_IAS.recorridos R";

            query += " inner join THE_BEST_IAS.ciudades CO on R.ciu_codigo_origen = CO.ciu_codigo";
            query += " inner join THE_BEST_IAS.ciudades CD on R.ciu_codigo_destino = CD.ciu_codigo";
            query += " inner join THE_BEST_IAS.servicios S on R.serv_codigo = S.serv_codigo";


            //Aplicar los filtros
            if (cbFiltroOrigen.SelectedIndex >= 0)
            {
                query += " WHERE co.ciu_nombre = '" + cbFiltroOrigen.SelectedItem.ToString() + "'";
                primerFiltro = false;
            }

            if (cbFiltroDestino.SelectedIndex >= 0)
            {
                if (primerFiltro)
                {
                    query += " WHERE";
                    primerFiltro = false;
                }
                else
                {
                    query += " AND";
                }

                query += " CD.ciu_nombre = '" + cbFiltroDestino.SelectedItem.ToString() + "'";
                primerFiltro = false;
            }

            if (cbFiltroServicio.SelectedIndex >= 0)
            {
                if (primerFiltro)
                {
                    query += " WHERE";
                    primerFiltro = false;
                }
                else
                {
                    query += " AND";
                }

                query += " S.serv_nombre = '" + cbFiltroServicio.SelectedItem.ToString() + "'";
                primerFiltro = false;
            }

            if (!rbTodos.Checked)
            {
                if (rbActivo.Checked)
                    valorEliminado = '0';   //Solo activos
                else
                    valorEliminado = '1';   //Solo eliminados

                //Añadir
                if (primerFiltro)
                {
                    query += " WHERE";
                    primerFiltro = false;
                }
                else
                {
                    query += " AND";
                }
                query += " rec_eliminado = " + valorEliminado;
            }

            query += " ORDER BY 1";

            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    tabla.Rows.Add(new object[] { 
                           dr["rec_codigo"].ToString().Trim(), 
                           dr["origen"].ToString().Trim(), 
                           dr["destino"].ToString().Trim(),
                           dr["serv_nombre"].ToString().Trim(),
                           dr["rec_precio_base_pasaje"].ToString().Trim(),
                           dr["rec_precio_base_encomienda"].ToString().Trim(),
                           dr["rec_eliminado"].ToString().Trim()
                         });
                }
            }
            else
            {
                MessageBox.Show("No se datos, por favor, considerar sus filtros", "INFORMACION");
            }
        }

        //Inicializar columnas
        private void CrearColumnasTabla()
        {
            tabla.Columns.Add("rec_codigo", "CODIGO");
            tabla.Columns.Add("ciu_codigo_origen", "ORIGEN");
            tabla.Columns.Add("ciu_codigo_destino", "DESTINO");
            tabla.Columns.Add("serv_codigo", "SERVICIO");
            tabla.Columns.Add("rec_precio_base_pasaje", "PRECIO BASE PASAJE ($)");
            tabla.Columns.Add("rec_precio_base_encomienda", "PRECIO BASE ENCOMIENDA ($)");
            tabla.Columns.Add("rec_eliminado", "ELIMINADO");
        }

        //Habilita o deshabilita la opción para crear o editar un registro
        private void BotonesEdicion(bool habilitar)
        {
            if (habilitar)
            {
                grEdicion.Enabled = true;
                buGuardar.Enabled = true;
                buCancelar.Enabled = true;
            }
            else
            {
                grEdicion.Enabled = false;
                buGuardar.Enabled = false;
                buCancelar.Enabled = false;
                cbServicio.Visible = false;
                lsServicios.Visible = false;
            }
            LimpiarEdicion();
        }

        private void buNuevo_Click(object sender, EventArgs e)
        {
            modoABM = Constantes.ModoAbm.Alta;
            BotonesEdicion(true);
            CargarDatosEdicion(true);
        }

        private void buModificar_Click(object sender, EventArgs e)
        {
            //Obtener nombre del elemento a modificar
            if (tabla.SelectedRows.Count > 0)
            {
                BotonesEdicion(true);
                CargarDatosEdicion(false);

                codigoRecorrido = tabla.SelectedRows[0].Cells[0].Value.ToString();

                if (tabla.SelectedRows[0].Cells[6].Value.ToString() == "1")
                {
                    chHabilitado.Checked = false;
                }
                else
                {
                    chHabilitado.Checked = true;
                }

                modoABM = Constantes.ModoAbm.Modificacion;

                //Leer datos en los controles
                //Seleccionar los datos de los ComboBox
                cbOrigen.SelectedIndex = cbOrigen.Items.IndexOf(tabla.SelectedRows[0].Cells[1].Value.ToString());
                cbDestino.SelectedIndex = cbDestino.Items.IndexOf(tabla.SelectedRows[0].Cells[2].Value.ToString());
                cbServicio.SelectedIndex = cbServicio.Items.IndexOf(tabla.SelectedRows[0].Cells[3].Value.ToString());

                //Copiar de la tabla
                txBaseKg.Text = tabla.SelectedRows[0].Cells[5].Value.ToString();
                txBasePasaje.Text = tabla.SelectedRows[0].Cells[4].Value.ToString();

                if (tabla.SelectedRows[0].Cells[6].Value.ToString() == "0")
                {
                    chHabilitado.Checked = true;
                }
                else {
                    chHabilitado.Checked = false;
                }

            }
            else
            {
                MessageBox.Show("Seleccione una registro.", "Error");
            }
        }

        private void buBaja_Click(object sender, EventArgs e)
        {
            //Da de baja el elemento seleccionado
            if (tabla.SelectedRows.Count > 0)
            {
                codigoRecorrido = tabla.SelectedRows[0].Cells[0].Value.ToString();

                //Determinar si esta habilitado
                if (tabla.SelectedRows[0].Cells[6].Value.ToString() == "0")
                {

                    codigoRecorrido = tabla.SelectedRows[0].Cells[0].Value.ToString();

                    if (MessageBox.Show("¿Dar de baja el recorrido '" + codigoRecorrido + "'?", "Baja", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                        string sConnectionString = Settings.Default.GD1C2013ConnectionString;
                        SqlConnection connection = new SqlConnection(sConnectionString);
                        SqlCommand cmd = new SqlCommand("THE_BEST_IAS.pr_baja_recorrido", connection);
            
                        cmd.CommandType = CommandType.StoredProcedure;

                        cmd.Parameters.Add(new SqlParameter("@p_rec_codigo", SqlDbType.Int)).Value = codigoRecorrido;

                        connection.Open();
                        cmd.ExecuteNonQuery(); 
                        connection.Close();

                        //Actualizar tabla
                        CargarTabla();
                    }
                }
                else
                {
                    MessageBox.Show("El recorrido '" + codigoRecorrido + "' ya esta dado de baja.", "Error");
                }


            }
            else
                MessageBox.Show("Seleccione un registro.", "Error");
        }

        //Limpia los datos de edición
        private void LimpiarEdicion()
        {
            //RESETEAR TODOS LOS VALORES
            chHabilitado.Checked = true;
            cbOrigen.Items.Clear();
            cbDestino.Items.Clear();
            txBaseKg.Text = "";
            txBasePasaje.Text = "";
        }

        //Carga la lista de ciudades en el ComboBox
        private void cargarCiudadesCombo(ComboBox control)
        {
            string query;

            control.Items.Clear();

            query = "SELECT ciu_nombre FROM THE_BEST_IAS.ciudades ORDER BY 1";

            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    control.Items.Add(dr["ciu_nombre"].ToString().Trim());
                }
            }
        }

        //Carga la lista de servicios en el combo
        private void cargarCiudadesCombo()
        {
            string query;

            cbFiltroServicio.Items.Clear();

            query = "SELECT serv_nombre FROM THE_BEST_IAS.servicios ORDER BY 1";

            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    cbFiltroServicio.Items.Add(dr["serv_nombre"].ToString().Trim());
                }
            }
        }

        //Cargar datos para edición
        private void CargarDatosEdicion(bool esAlta)
        {
            cargarCiudadesCombo(cbOrigen);
            cargarCiudadesCombo(cbDestino);
            cargarCiudadesCombo();

            //Determinar si cargar la lista de Checks o el combo para una modificacion
            if (esAlta)
            {
                lsServicios.Visible = true;
                cbServicio.Visible = false;
                CargarListaCheck();
            }
            else
            {
                cbServicio.Visible = true;
                lsServicios.Visible = false;
                CargarComboServicios();
            }

        }

        //Carga la lista de servicios en la lista de Check, para un alta
        private void CargarListaCheck()
        {
            string query;

            lsServicios.Items.Clear();

            query = "SELECT serv_nombre FROM THE_BEST_IAS.servicios ORDER BY 1";

            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    lsServicios.Items.Add(dr["serv_nombre"].ToString().Trim());
                }
            }
        }

        //Carga la lista de servicios en el combo para modificación.
        private void CargarComboServicios()
        {
            string query;

            cbServicio.Items.Clear();

            query = "SELECT serv_nombre FROM THE_BEST_IAS.servicios ORDER BY 1";

            SqlDataReader dr = DbHelper.ExecuteQuery(query);

            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    cbServicio.Items.Add(dr["serv_nombre"].ToString().Trim());
                }
            }
        }

    }
}
